package com.pithypan.common.utils;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.util.resources.th.CalendarData_th;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

/**
 * 通过Shell脚本，执行ffmpeg指令
 */
//生成缩略图
public class ScaleFilter {

    private static Logger logger = LoggerFactory.getLogger(ScaleFilter.class);


    /**
     * 生成视频封面
     * @param sourceFile    源文件路径（视频、图片）
     * @param width         缩略图宽度
     * @param targetFile    生成的封面路径
     */
    public static void createCover4Video(File sourceFile, Integer width, File targetFile) {
        try {
            String cmd = "ffmpeg -i %s -y -vframes l -vf scale=%d:%d/a %s";
            ProcessUtils.executeCommand(String.format(cmd, sourceFile.getAbsoluteFile(), width, width, targetFile.getAbsoluteFile()), false);
        } catch (Exception e) {
            logger.error("生成视频封面失败！！！");
        }
    }


    /**
     * 生成图片缩略图
     * @param file            源文件
     * @param thumbnailWidth  缩略图宽度
     * @param targetFile      生成的缩略图路径
     * @param delSource       是否删除源文件
     * @return                缩略图是否生成成功
     */
    public static Boolean createThumbnailWidthFFmpeg(File file, int thumbnailWidth, File targetFile, Boolean delSource) {
        try {
            BufferedImage src = ImageIO.read(file);
            //thumbnailWidth：缩略图的宽度      thumbnailHeight：缩略图高度
            int sorceW = src.getWidth();
            int sorceH = src.getHeight();
            //小于 指定高宽则不压缩
            if (sorceW <= thumbnailWidth) {
                return false;
            }
            compressImage(file, thumbnailWidth, targetFile, delSource);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }


    /**
     * 执行ffmpeg指令，生成图片缩略图
     * @param sourceFile 源文件
     * @param width      缩略图宽度
     * @param targetFile 生成的缩略图路径
     * @param delSource  是否删除源文件
     */
    public static void compressImage(File sourceFile,Integer width, File targetFile, Boolean delSource) {
        try {
            String cmd = "ffmpeg -i %s -vf scale=%d:-l %s -y";
            ProcessUtils.executeCommand(String.format(cmd, sourceFile.getAbsoluteFile(), width, targetFile.getAbsoluteFile()), false);
            if (delSource) {
                FileUtils.forceDelete(sourceFile);  //删除源文件
            }
        } catch (Exception e) {
            logger.error("压缩图片失败！！！");
        }
    }
}
